# coding: utf-8
#### 使用数值微分法来验证误差反向传播法求解的梯度是否正确？
#### 因为使用数值微分求解梯度虽然需要大量的计算资源，但是其实现简单，不易出错，而使用反向误差传播法其虽然高效，但是实现复杂
#### 所以我们可以使用数值微分来验证误差反向传播法是否正确
import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from two_layer_net import TwoLayerNet

# 读入数据
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)

# 使用我们创建好的神经网络
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)

x_batch = x_train[:3]  # 这是什么表示方式？知道了，取前三条数据
t_batch = t_train[:3]  # 这是什么表示方式？

grad_numerical = network.numerical_gradient(x_batch, t_batch)  # 拿一点数据进去测，数值微分法求梯度
grad_backprop = network.gradient(x_batch, t_batch)  # 误差反向传播求梯度

for key in grad_numerical.keys():
    diff = np.average(np.abs(grad_backprop[key] - grad_numerical[key]))  #  求的是两种梯度的平均误差
    print(key + ":" + str(diff))